// 导入腾讯云 COS 依赖包，得到一个构造函数
import COS from 'cos-js-sdk-v5'
import { v4 } from 'uuid'

// 向外按需导出一个函数，作用：把传递进来的数组，转为树形数据，return 回去
// 形参中的 arr 是所有部门的数组；pid 是部门的父 id
export const arr2Tree = (arr, pid) => {
  // 根据 pid，查找到的子部门，都放到这个 result 中
  const result = []

  arr.forEach(item => {
    // 循环 arr 中的每一个部门，判断当前循环项，是否为 pid 的子部门
    if (item.pid === pid) {
      result.push(item)
      // 查找 item 这个部门下，是否有子部门，得到的子部门用 son 接收
      const son = arr2Tree(arr, item.id)
      if (son.length !== 0) {
        // 如果 son.length 不为0，证明 item 下，有所属的子部门
        item.children = son
      }
    }
  })

  // 只要上面的 forEach 执行完啦，那么 result 中存储的，就是 pid 下面的所有子部门
  return result
}

// 创建 COS 的实例对象，基于创建的实例对象，可以操作自己的 COS 存储
const cos = new COS({
  SecretId: 'AKIDaFoBNPEqEPM8j6EC1g9OQGzZ8hGiz5yc',
  SecretKey: 'c4KMDzb1DE2e192iGgvxnQpzvb1DAvWw'
})

// 基于 Promise 封装一个文件上传的函数，
// 然后，把封装的函数，按需导出出去，供其它组件使用
// 形参中的 file 表示要上传的文件
export const uploadFile2COS = (file) => {
  // new Promise(fn) 表示进行一个异步操作，其中 fn 函数用来封装具体的异步操作
  // 在 fn 的形参中，有 resolve 和 reject 两个回调，分别是“成功”和“失败”的回调
  return new Promise(function (resolve, reject) {
    // 需要调用 cos 实例提供的 API，把文件上传到指定的存储桶中
    cos.putObject({
      Bucket: 'bj-145-1303977342', // 存储桶的名字
      Region: 'ap-beijing', // 存储桶所属的地域
      Key: v4(), // 基于 uuid 提供的 v4() 函数生成随机的文件名
      StorageClass: 'STANDARD',
      Body: file // 要上传的文件
    }, function (err, data) {
      // 失败
      if (err) return reject(err)
      // 成功
      resolve(data)
    })
  })
}
